package com.mayflygeek.mayflyask.dao;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import com.mayflygeek.mayflyask.entity.User;
/**
 * @author 蝈蝈 
 * @email guodefu909@126.com
 * @team 蜉蝣极客
 * @link www.mayflygeek.com
 * JpaRepository 接口及其父接口和 JpaSpecificationExecutor 接口的方法不用写实现，spring data 会自动创建实现
 */
public interface UserDao extends JpaRepository<User, Long>,JpaSpecificationExecutor<User>{
	
	/**
	 * 简单条件查询如果符合 Spring Data 规范可以不用写实现：
	 * 查询方法以 findBy | readBy | getBy 开头
	 * 条件属性首字母大写
	 * 条件属性连接关键字有 And Or LessThan GreaterThan 等
	 * 条件属性名称与个数要与参数的位置与个数一一对应
	 * 还可以直接在方法的参数上加入分页或排序的参数
	 */
	
	// 相当于 userName = ?1
	User getByUserName(String userName);
	
	// 相当于 where userName like ?1 and nickName like ?2
	Page<User> findByUserNameLikeAndNickNameLike(String userName, String nickName, Pageable pageable);
	
	
	/**
	 * @Query("") 定义 JPQL
	 * @Query(value="" ,nativeQuery=true) 定义原生 sql
	 * @Modifying 定义更新删除操作
	 */
	
	@Modifying
	@Query("UPDATE User u SET u.status = ?1 WHERE id = ?2")
	int updateUserStatus(Integer status,Long id);
	
	@Modifying
	@Query("UPDATE User u SET u.password = :password WHERE id = :id")
	int updateUserPassword(@Param("id") Long id, @Param("password") String password);
	
	@Modifying
	@Query("DELETE User u WHERE id in (?1)")
	int deleteUserByIds(List<Long> ids);
	
	
}
